#include "ContactsMapper.h"
#include "../http_server/ContactException.h"
#include <fstream>

#define TEXT_NAME "contacts.bin"

using std::ios;
using std::cout;
using std::endl;

// 将通讯录信息存放人本地文件中，后续可以存入数据库中
void ContactsMapper::selectContacts(contacts::Contacts* contacts) const
{
    std::fstream input(TEXT_NAME,ios::in|ios::binary); // 以二进制写入方式打开文件contacts.bin
    if(!input) // 如果打开失败
    {
        cout << "---> (ContactsMapper::selectContacts) " << TEXT_NAME << ": File not found.  Creating a new file." << endl;
    }
    else if(!contacts->ParseFromIstream(&input)) // 反序列化解析并且读取到contacts中
    {
        input.close();
        throw ContactException("(ContactsMapper::selectContacts) Failed to parse contacts.");
    }
    input.close();
}

void ContactsMapper::insertContacts(contacts::Contacts& contacts) const 
{
    std::fstream output(TEXT_NAME, ios::out | ios::trunc | ios::binary); //输出，截断，和二进制方式打开文件流
    if (!contacts.SerializeToOstream(&output)) // 尝试将contacts对象序列化并写入到contacts.bin中
    {
        output.close();
        throw ContactException("(ContactsMapper::insertContacts) Failed to write contacts.");
    }
    output.close();
}

